package org.huangrui.spark.scala.sql

import org.apache.spark.sql.{Encoders, Row, SparkSession}

/**
 * @Author hr
 * @Create 2024-10-20 9:50 
 */
object SparkSQL02_Model_1 {
  def main(args: Array[String]): Unit = {
    val session = SparkSession.builder().appName("SparkSQL02_Model").master("local[*]").getOrCreate()
    // TODO Spark SQL中对数据模型也进行了封装 ： RDD -> DataFrame
    //      对接文件数据源时，会将文件中的一行数据封装为Row对象
    val df = session.read.json("data/user.json")

    // TODO  导入 SparkSession 隐式转换 在使用DataFrame时，如果涉及到转换操作，需要引入转换规则
    import session.implicits._

    df.show()
    // TODO DataFrame
    df.foreach {
      row: Row => {
        println(row.getLong(0), row.getLong(1))
      }
    }

    // DataFrame => SQL
    df.createOrReplaceTempView("user")
    session.sql("select * from user").show()
    session.sql("select name,age from user").show()
    session.sql("select avg(age) from user").show()
    // DataFrame => DSL
    df.select("name", "age").show()
    df.select(df("name"), df("age") + 1).show()

    // TODO 将数据模型中的数据类型进行转换，将Row转换成其他对象进行处理
    // DataFrame <=> DataSet
    val userDs = df.as[User]
    userDs.foreach((r: User) => println(r.age))

    session.stop()
  }
  case class User(id: Long, age: Long, name: String)
}
